home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / comms / other / ftp4all / src / amigapatch / amiga-2.26.diff next >
Text File  |  1999-06-14  |  45KB  |  1,230 lines

  1. diff -urbNB /tmp/differ/ftpd-2.25/CHANGES ./CHANGES
  2. --- /tmp/differ/ftpd-2.25/CHANGES    Mon Apr  5 17:03:34 1999
  3. +++ ./CHANGES    Thu Jun  3 13:30:52 1999
  4. @@ -1,7 +1,64 @@
  5.  VERSION HISTORY
  6.  ===============
  7.  
  8. -- Version 2.25b (Release on 27/Mar/19999)
  9. +- Version 2.26a (Released on 02/Jun/1999)
  10. + + Removed the bug that the logfile was not written at all.
  11. + + Fixed another small thing you are not interested in.
  12. + + Changed the behaviour when a .perm-file got 0-size.
  13. + + FAQ-change regarding GPL.
  14. +
  15. +- Version 2.26 (Released on 30/May/1999)
  16. +[New Features]
  17. + +bnc4all-support included. You can use the old bouncing method if you
  18. +  specify "rftpdbouncer on" in ftpd.conf. Else the bnc4all-auth-method
  19. +  is used.
  20. +
  21. +[Additional features]
  22. + +Check and Dupecheck are now available with wildcards, like
  23. +  "check .r* /checkscript" or a global checker with "check * /script".
  24. +  You can even set wildcards like ".*op" but it works ONLY with 3
  25. +  char-extensions (like .r00 or .bin) so a file like "archive.hzop"
  26. +  wouldnt get checked by the daemon. Thanks to BadSec for the patch.
  27. + +swapreuid() is now taken for proper handling of ports < 1024 and
  28. +  setuid environments. (hey draven :)
  29. + +the file/dirnameconversion gets another bit. when adding 0x08 or
  30. +  0x80 to the "filenameconversion" in ftpd.conf you can specify your
  31. +  own characters you don't want to see in your site. This specification
  32. +  is done via "convchars <stringofchars>" somewhere in ftpd.conf.
  33. +  Don't place spaces within this stringofchars.
  34. + +If you specify "max_add <number>" in ftpd.conf the groups can not get
  35. +  larger than this number. This is only for groupops (that they can't add loads
  36. +  of users to their group), the root is still allowed to do anything.
  37. + +You can specify now (for groupop as well as for usereditors) the fixed
  38. +  values for limits and credits. Specify in ftpd.conf "groupop_limit <lm>"/
  39. +  "useredit_limit <lm>" (i.e. 33) and "groupop_cred <mb>"/
  40. +  "useredit_cred <mb>" (both in megabytes) and the groupops just can change
  41. +  to this limit, nothing else. For the limits the usual value is 33, for
  42. +  credits 0.
  43. +
  44. +[Bugfixes]
  45. + +Fixed the problem when a script got executed and the whole site stalls.
  46. +  For fans of background knownledge: we changed the IPC from named pipes
  47. +  (which were a quite old system) to socketpairs and this prevents from
  48. +  stalling in some occasions.
  49. +
  50. +  NOTE: This fix was NOT possible in the AMIGA version due to problems with
  51. +        the BSD-platform of amiga. (senfgurke)
  52. +
  53. + +Fixed a bug when the pre_upload or pre_download don't give any line in
  54. +  return.
  55. + +Fixed a bug which occured while building the internal top-list (possible
  56. +  pipe-error). Thanks to BadSec for pointing out and fixing it.
  57. + +Fixed the bug, when setting "ident off" and idented users couldn't
  58. +  login.
  59. + +Users now can really list themselfes with "site usr list <username>".
  60. +
  61. +[Miscellanous stuff]
  62. + +Errors removed which occured due to the loss of prototypes. Removed all
  63. +  warnings while compiling with -Wall (gcc 2.7.2.3). Probably the daemon is
  64. +  now more stable.
  65. +
  66. +- Version 2.25b (Released on 27/Mar/1999)
  67.   +Fixed another bug which could have resulted in a floating point exception
  68.    at certain events.
  69.  
  70. diff -urbNB /tmp/differ/ftpd-2.25/FTP4ALL-FAQ ./FTP4ALL-FAQ
  71. --- /tmp/differ/ftpd-2.25/FTP4ALL-FAQ    Sun Mar  7 21:16:46 1999
  72. +++ ./FTP4ALL-FAQ    Thu Jun  3 13:29:08 1999
  73. @@ -31,9 +31,8 @@
  74.     to system shell accounts.
  75.  
  76.     Q: Mhhh... sounds like a great deal, what does it cost ?
  77. -   A: FTP4ALL is distributed under the GPL, and is free if you don't use
  78. -   it commercially. Please read and understand the conditions of this
  79. -   licence.
  80. +   A: FTP4ALL is distributed under the GPL. Please read and understand
  81. +   the conditions of this licence.
  82.  
  83.     Q: Are there any FTP4ALL related limitations ?
  84.     A: No, just the normal limitations that applies for user accounts
  85. diff -urbNB /tmp/differ/ftpd-2.25/src/commands.c ./src/commands.c
  86. --- /tmp/differ/ftpd-2.25/src/commands.c    Sun Mar  7 21:16:46 1999
  87. +++ ./src/commands.c    Thu Jun  3 13:29:08 1999
  88. @@ -24,8 +24,10 @@
  89.  #include <unistd.h>
  90.  #include <sys/socket.h>
  91.  #include <sys/stat.h>
  92. +#include <string.h>
  93.  #include "tweak.h"
  94.  #include "externs.h"
  95. +#include "glob_proc.h"
  96.  
  97.  int cmd_smnt(char** p, int n)
  98.  { return send_reply(502,"SMNT command not implemented.");
  99. diff -urbNB /tmp/differ/ftpd-2.25/src/common.c ./src/common.c
  100. --- /tmp/differ/ftpd-2.25/src/common.c    Sat Mar 27 16:52:35 1999
  101. +++ ./src/common.c    Thu Jun  3 13:29:08 1999
  102. @@ -32,6 +32,8 @@
  103.  #include <sys/socket.h>
  104.  #include <arpa/inet.h>
  105.  #include <signal.h>
  106. +#include <unistd.h>
  107. +#include <sys/wait.h>
  108.  #include "tweak.h"
  109.  #ifdef HAVE_SYS_SELECT_H
  110.    #include <sys/select.h>
  111. @@ -40,6 +42,7 @@
  112.    #include <sys/time.h>
  113.  #endif
  114.  #include "externs.h"
  115. +#include "glob_proc.h"
  116.  
  117.  extern signal_handler(int sig);
  118.  
  119. diff -urbNB /tmp/differ/ftpd-2.25/src/commondef.h ./src/commondef.h
  120. --- /tmp/differ/ftpd-2.25/src/commondef.h    Sun Mar  7 21:16:46 1999
  121. +++ ./src/commondef.h    Thu Jun  3 13:31:19 1999
  122. @@ -22,8 +22,8 @@
  123.  #ifndef _ftpd_commondef_h
  124.  #define _ftpd_commondef_h
  125.  
  126. -#define VERSION "2.25 (07/Mar/1999)"
  127. -#define SVERSION "2.25"
  128. +#define VERSION "2.26a AMIGA (02/Jun/1999)"
  129. +#define SVERSION "2.26"
  130.  
  131.  struct group_s
  132.  { char name[10];
  133. diff -urbNB /tmp/differ/ftpd-2.25/src/configd.c ./src/configd.c
  134. --- /tmp/differ/ftpd-2.25/src/configd.c    Sun Mar  7 21:16:46 1999
  135. +++ ./src/configd.c    Thu Jun  3 13:29:08 1999
  136. @@ -27,12 +27,16 @@
  137.  #include <stdlib.h>
  138.  #include <string.h>
  139.  #include <unistd.h>
  140. +#include <sys/socket.h>
  141. +#include <sys/stat.h>
  142.  #include "tweak.h"
  143.  #ifdef DES_ENCRYPTION
  144.    #include "des.h"
  145.  #endif
  146.  #include "externsd.h"
  147.  
  148. +int parse_command(char* p, char** param, int max, int* n);
  149. +
  150.  void* alloc(void* buf, long size)
  151.  { if (buf) return realloc(buf,size); else return malloc(size);
  152.  }
  153. @@ -781,7 +785,7 @@
  154.  
  155.  long get_rights(char *p, long* value, char *line)
  156.  { long v;
  157. -  int n;
  158. +  char n;
  159.    char *q;
  160.    
  161.    *value=0;
  162. @@ -789,8 +793,9 @@
  163.    while (skipspace(&p))
  164.    { v = 0;
  165.      q = p;
  166. +    n = 0;
  167.      if (skipnspace(&q)) *(q++) = '\0';
  168. -    if (n = (*p == '!')) p++;
  169. +    if (*p == '!') { n = 1; p++; }
  170.      if (!strcasecmp(p,"all")) v = R_ALL; else
  171.      if (!strcasecmp(p,"enable")) v |= R_ENABLE; else
  172.      if (!strcasecmp(p,"disable")) v |= R_DISABLE; else
  173. @@ -816,9 +821,10 @@
  174.      { sprintf(line,"Unknown right: %s",p);
  175.        return -1;
  176.      }
  177. -    if (n) *value &= ~v; else *value |= v;
  178. +    if (n == 1) *value &= ~v; else *value |= v;
  179.      p = q;
  180.    }
  181. +  return 0;
  182.  }
  183.  
  184.  int load_config_file(const char* filename, FILE** file, char* line, int* lineno,
  185. @@ -957,8 +963,9 @@
  186.      while (skipspace(&p))
  187.      { v = 0;
  188.        q = p;
  189. +      n = 0;
  190.        if (skipnspace(&q)) *(q++) = '\0';
  191. -      if (n = (*p == '!')) p++;
  192. +      if (*p == '!') { n = 1; p++; }
  193.        if (!strcasecmp(p,"all")) v = LG_ALL; else
  194.        if (!strcasecmp(p,"cd")) v |= LG_CD; else
  195.        if (!strcasecmp(p,"chmod")) v |= LG_CHMOD; else
  196. @@ -971,7 +978,7 @@
  197.        if (!strcasecmp(p,"put")) v |= LG_PUT; else
  198.        if (!strcasecmp(p,"rd")) v |= LG_RD; else
  199.        if (!strcasecmp(p,"ren")) v |= LG_REN; else return -1;
  200. -      if (n) logc &= ~v; else logc |= v;
  201. +      if (n == 1) logc &= ~v; else logc |= v;
  202.        p = q;
  203.      }
  204.        } else if (!strcasecmp(p,"logfile"))
  205. @@ -1112,6 +1119,16 @@
  206.        { if (get_string(q,&pre_download) == -1) return -1;
  207.        } else if (!strcasecmp(p,"checktimeout"))
  208.        { if (get_integer(q,&checktimeout,0,100) == -1) return -1;
  209. +      } else if (!strcasecmp(p,"rftpdbouncer"))
  210. +      { if (get_onoff(q,&rftpdbouncer) == -1) return -1;
  211. +      } else if (!strcasecmp(p,"convchars"))
  212. +      { if (get_string(q,&convchars) == -1) return -1;
  213. +      } else if (!strcasecmp(p,"max_added"))
  214. +      { if (get_integer(q,&max_added,0,100) == -1) return -1;
  215. +      } else if (!strcasecmp(p,"useredit_cred"))
  216. +      { if (get_integer(q,&useredit_cred,0,100) == -1) return -1;
  217. +      } else if (!strcasecmp(p,"groupop_cred"))
  218. +      { if (get_integer(q,&groupop_cred,0,100) == -1) return -1;
  219.        } else
  220.        return -1;
  221.      }
  222. diff -urbNB /tmp/differ/ftpd-2.25/src/dir.c ./src/dir.c
  223. --- /tmp/differ/ftpd-2.25/src/dir.c    Sun Mar  7 21:16:46 1999
  224. +++ ./src/dir.c    Thu Jun  3 13:29:08 1999
  225. @@ -25,9 +25,11 @@
  226.  #include <stdio.h>
  227.  #include <string.h>
  228.  #include <sys/stat.h>
  229. +#include <unistd.h>
  230.  #include "tweak.h"
  231.  #include "externs.h"
  232.  #include "perm.h"
  233. +#include "glob_proc.h"
  234.  
  235.  int show_readmefile(void)
  236.  { FILE* file;
  237. diff -urbNB /tmp/differ/ftpd-2.25/src/externs.h ./src/externs.h
  238. --- /tmp/differ/ftpd-2.25/src/externs.h    Sun Mar  7 21:19:37 1999
  239. +++ ./src/externs.h    Thu Jun  3 13:29:08 1999
  240. @@ -38,6 +38,7 @@
  241.  extern int                 chmodallowed;
  242.  extern int                 close_reason;
  243.  extern char                close_server;
  244. +extern char*               convchars;
  245.  extern char                cwd[256];
  246.  extern struct check_s*     dcheck;
  247.  extern int                 dcheck_count;
  248. diff -urbNB /tmp/differ/ftpd-2.25/src/externsd.h ./src/externsd.h
  249. --- /tmp/differ/ftpd-2.25/src/externsd.h    Sun Mar  7 21:16:46 1999
  250. +++ ./src/externsd.h    Thu Jun  3 13:29:08 1999
  251. @@ -61,6 +61,7 @@
  252.  extern int                 child_size;
  253.  extern int                 children;
  254.  extern char                chmodallowed;
  255. +extern char*               convchars;
  256.  extern struct check_s*     dcheck;
  257.  extern int                 dcheck_count;
  258.  extern int                 dcheck_size;
  259. @@ -83,6 +84,7 @@
  260.  extern char*               group_file;
  261.  extern int                 group_size;
  262.  extern int                 groupop_limit;
  263. +extern int                 groupop_cred;
  264.  extern long                groupop_rights;
  265.  extern char                ident_mode;
  266.  extern struct msg_s        list_msg;
  267. @@ -95,6 +97,7 @@
  268.  extern int                 login_kick;
  269.  extern int                 login_kick_signo;
  270.  extern int                 login_retries;
  271. +extern int                 max_added;
  272.  extern int                 max_anon;
  273.  extern int                 max_anon_domain;
  274.  extern int                 max_anon_ip;
  275. @@ -112,6 +115,7 @@
  276.  extern char*               program_name;
  277.  extern char*               readme_file;
  278.  extern char                resolver;
  279. +extern char                rftpdbouncer;
  280.  extern char*               script_path;
  281.  extern char                server_closed;
  282.  extern char*               server_dir;
  283. @@ -143,6 +147,7 @@
  284.  extern char*               user_file;
  285.  extern int                 user_size;
  286.  extern int                 useredit_limit;
  287. +extern int                 useredit_cred;
  288.  extern long                useredit_rights;
  289.  extern char                wait_port;
  290.  extern struct msg_s        welcome_msg;
  291. diff -urbNB /tmp/differ/ftpd-2.25/src/ff.c ./src/ff.c
  292. --- /tmp/differ/ftpd-2.25/src/ff.c    Sun Mar  7 21:16:46 1999
  293. +++ ./src/ff.c    Thu Jun  3 13:29:08 1999
  294. @@ -27,6 +27,7 @@
  295.  #include <sys/stat.h>
  296.  #include "tweak.h"
  297.  #include "externs.h"
  298. +#include "glob_proc.h"
  299.  
  300.  int cmd_site_ff_syntax(int rno)
  301.  { return send_reply(rno,
  302. @@ -85,6 +86,7 @@
  303.  
  304.  void convert_filename(char* filename, int mode)
  305.  { char* name;
  306. +  char* tmp;
  307.  
  308.    if (!mode) return;
  309.    name = filename + strlen(filename);
  310. @@ -109,6 +111,14 @@
  311.    }
  312.    if (mode & 0x04) while (*filename)
  313.    { if (isspace(*filename)) *filename = '_';
  314. +    filename++;
  315. +  }
  316. +  if (mode & 0x08) while (*filename)
  317. +  { tmp = convchars;
  318. +    while (*tmp)
  319. +    { if (*filename == *tmp) *filename = '_';
  320. +      tmp++;
  321. +    }
  322.      filename++;
  323.    }
  324.  }
  325. diff -urbNB /tmp/differ/ftpd-2.25/src/ftpd.c ./src/ftpd.c
  326. --- /tmp/differ/ftpd-2.25/src/ftpd.c    Sun Mar  7 21:16:46 1999
  327. +++ ./src/ftpd.c    Thu Jun  3 13:29:08 1999
  328. @@ -31,6 +31,7 @@
  329.  #include <unistd.h>
  330.  #include <netinet/in.h>
  331.  #include <sys/socket.h>
  332. +#include <arpa/inet.h>
  333.  #include <sys/wait.h>
  334.  #include "tweak.h"
  335.  #ifdef HAVE_SYS_SELECT_H
  336. @@ -43,6 +44,17 @@
  337.    #include "des.h"
  338.  #endif
  339.  #include "globalsd.h"
  340. +#include "glob_procd.h"
  341. +
  342. +int write_user_file(const char* filename, FILE* file);
  343. +int write_group_file(const char* filename);
  344. +void child_logout(struct child_s* c, int exitcode);
  345. +int in_iprange(long ip, char* iprange);
  346. +int in_ident(long ip, char* ident, char* iprange);
  347. +void print_configuration(void);
  348. +void child_communication(struct child_s* c);
  349. +void server_log_local(struct child_s* c, long l, char* str, ...);
  350. +char *rfc931(struct sockaddr_in* rmt_sin,struct sockaddr_in* our_sin);
  351.  
  352.  int send_reply(int s, int rno, char* buffer)
  353.  { char msg[8];
  354. @@ -63,7 +75,7 @@
  355.  
  356.    if ((file = fopen(filename,"wt")) == NULL) return -1;
  357.    for (i=0; i<user_count; i++, u++)
  358. -  { fprintf(file,"%s:%li:%li:%s:%li:%li:%li:*.*.*.*:%li:%s:0x%02lX:%li",
  359. +  { fprintf(file,"%s:%li:%li:%s:%li:%li:%li:*.*.*.*:%i:%s:0x%02lX:%li",
  360.        u->name,u->uid,u->gid,u->password,u->kb_downloaded,u->kb_uploaded,
  361.        u->last_login,u->limit,u->info,u->class,u->credit);
  362.      first = 1;
  363. @@ -117,7 +129,7 @@
  364.          strcpy(tstr,group_file ? group_file : ".groups");
  365.          strcat(tstr,".bak");
  366.          rename(group_file ? group_file : ".groups",tstr);
  367. -        write_user_file(user_file ? user_file : ".users");
  368. +        write_user_file(user_file ? user_file : ".users",NULL);
  369.          write_group_file(group_file ? group_file : ".groups");
  370.          time(&t);
  371.          strftime(tstr,sizeof(tstr),"%a %b %d, %Y %H:%M:%S",localtime(&t));
  372. @@ -132,7 +144,7 @@
  373.          if (log_pid) fclose(log_program_f);
  374.          exit(e);
  375.        case SIGUSR1 :
  376. -        write_user_file(user_file ? user_file : ".users");
  377. +        write_user_file(user_file ? user_file : ".users",NULL);
  378.          write_group_file(group_file ? group_file : ".groups");
  379.          if (logf) fflush(logf);
  380.          fflush(errlogf);
  381. @@ -260,17 +272,18 @@
  382.    unsigned long int oi;
  383.    short              cn;
  384.    int                reuse_addr = 1;
  385. -  char               bounced_idnt[256];
  386. +  char               bounced_idnt[255];
  387.    char               bounced_user[10];
  388.    struct sockaddr_in bounced_addr;
  389.    int                use_bouncer = 0;
  390. +  char               auth[4];
  391.  
  392.  #ifndef HAVE_SIGSET
  393.    sigfillset(&sig_act.sa_mask);
  394.    sig_act.sa_flags = SA_RESTART;
  395.    #define sigset(x,y) sig_act.sa_handler = y; sigaction(x,&sig_act,NULL)
  396.  #endif
  397. -  printf("FTP4ALL "VERSION", Copyright (C) 1996,1997 by Christoph Schwarz\n");
  398. +  printf("FTP4ALL "VERSION", Copyright (C) 1996,1997,1998,1999 by Crescent\n");
  399.  #ifdef DEBUG
  400.    debugf = fopen("ftp4all-debug","wt");
  401.    if (!debugf)
  402. @@ -327,6 +340,7 @@
  403.    else { srv_addr.sin_addr.s_addr = inet_addr(other_ip); }
  404.    srv_addr.sin_port        = htons((u_short)port);
  405.    bzero(srv_addr.sin_zero, sizeof srv_addr.sin_zero);
  406. +  swapreuid();
  407.    while (port && bind(ss,(struct sockaddr*)&srv_addr,sizeof(srv_addr)) == -1)
  408.    { if (errno == EADDRINUSE)
  409.      { if (wait_port)
  410. @@ -343,7 +357,7 @@
  411.        return errno;
  412.      }
  413.    }
  414. -
  415. +  swapreuid();
  416.    if (NULL != bouncer)
  417.    { bouncer_ip.sin_addr.s_addr = inet_addr(bouncer);
  418.      if (bouncer_ip.sin_addr.s_addr == -1 ) {
  419. @@ -435,12 +449,22 @@
  420.          if (NULL != bouncer)
  421.          {
  422.            if (rem_addr.sin_addr.s_addr == bouncer_ip.sin_addr.s_addr)
  423. -          {
  424. -            read(cs, bounced_idnt, sizeof bounced_idnt);
  425. -            bounced_addr.sin_addr.s_addr = inet_addr(strstr(bounced_idnt, "@")+1);
  426. -            strtok(bounced_idnt, "@");
  427. -            strcpy(bounced_user, strchr(bounced_idnt, ' ')+1);
  428. +          { bzero(bounced_idnt,sizeof(bounced_idnt));
  429. +            read(cs, bounced_idnt, sizeof(bounced_idnt));
  430. +#ifdef DEBUG
  431. +  fprintf(debugf,"AUTH STR : %s",bounced_idnt);
  432. +#endif
  433. +            if (rftpdbouncer == 1) strncpy(auth,"IDNT",4); else strncpy(auth,"AUTH",4);
  434. +            if (strncmp(bounced_idnt,auth,4) != 0)
  435. +            { close(cs);
  436. +              use_bouncer = 0;
  437. +              cs = -1;
  438. +            } else
  439. +            { bounced_addr.sin_addr.s_addr = inet_addr(strstr(bounced_idnt,"@")+1);
  440. +              strtok(bounced_idnt,"@");
  441. +              strcpy(bounced_user,strchr(bounced_idnt,' ')+1);
  442.              use_bouncer = 1;
  443. +            }
  444.            } else
  445.            { hp = gethostbyaddr((char*)&rem_addr.sin_addr,sizeof(rem_addr.sin_addr), AF_INET);
  446.              use_bouncer = 0;
  447. @@ -522,6 +546,7 @@
  448.                    if (0 == strcmp(bounced_user, "unknown"))
  449.                      strncpy(child_new->ident, "UNKNOWN", 7);
  450.                    else memcpy(child_new->ident,bounced_user,strlen(bounced_user)+1);
  451. +                  send_reply(cs,220,"Authorization OK, proceed login with USER");
  452.                  } else
  453.                  { child_new->ip = ntohl(rem_addr.sin_addr.s_addr);
  454.                    memcpy(child_new->ident,idnt,strlen(idnt)+1);
  455. @@ -536,7 +561,8 @@
  456.              close(cs);
  457.            }
  458.          } else
  459. -        { hp = gethostbyaddr((char*)&rem_addr.sin_addr,sizeof(rem_addr.sin_addr),
  460. +        { if (use_bouncer) send_reply(cs,530,"Authorization FAILED, closing connection");
  461. +          hp = gethostbyaddr((char*)&rem_addr.sin_addr,sizeof(rem_addr.sin_addr),
  462.              AF_INET);
  463.            server_log_local(NULL,LG_LOGIN,"UNAUTHORIZED CONNECTION from %s@%s (%s)",
  464.              idnt, inet_ntoa(rem_addr.sin_addr),hp ? hp->h_name : "unknown host");
  465. diff -urbNB /tmp/differ/ftpd-2.25/src/ftps.c ./src/ftps.c
  466. --- /tmp/differ/ftpd-2.25/src/ftps.c    Sun Mar  7 21:16:46 1999
  467. +++ ./src/ftps.c    Thu Jun  3 13:29:08 1999
  468. @@ -30,6 +30,7 @@
  469.  #include <sys/socket.h>
  470.  #include "tweak.h"
  471.  #include "globals.h"
  472. +#include "glob_proc.h"
  473.  
  474.  void* alloc(void* buf, long size)
  475.  { if (buf) return realloc(buf,size); else return malloc(size);
  476. @@ -85,7 +86,7 @@
  477.    printf("+\n");
  478.    g = group;
  479.    for (i=0; i<group_count; i++)
  480. -  { if (scanf("%s %i",&g->name,&g->gid) != 2)
  481. +  { if (scanf("%s %li",g->name,&g->gid) != 2)
  482.      { fprintf(stderr,"ftps(%i): error reading group list.\n",getpid());
  483.        exit(-1);
  484.      }
  485. @@ -113,7 +114,7 @@
  486.    printf("+\n");
  487.    u = user;
  488.    for (i=0; i<user_count; i++)
  489. -  { if (scanf("%s %i",&u->name,&u->uid) != 2)
  490. +  { if (scanf("%s %li",u->name,&u->uid) != 2)
  491.      { fprintf(stderr,"ftps(%i): error reading user list.\n",getpid());
  492.        quit(CL_PIPEERR);
  493.        exit(-1);
  494. @@ -449,7 +450,7 @@
  495.    sigset(SIGTERM,signal_handler);
  496.    setvbuf(stdout,NULL,_IOLBF,0);
  497.    printf("SIN\n");
  498. -  scanf("%i %i %i %i %i %li %i %li %i %li %i %i %i %i ",&num_anon,&max_anon,
  499. +  scanf("%i %i %i %i %i %li %i %li %c %li %i %i %i %i ",&num_anon,&max_anon,
  500.      &num_users,&max_users,&login_kick,&other_ip_s,&login_retries,&logc,&touch,&ipaddr,
  501.      &sock,&fconv_mode,&chmodallowed,&checktimeout);
  502.    get_string(&permission_file,str,sizeof(str));
  503. @@ -459,6 +460,7 @@
  504.    get_string(&script_path,str,sizeof(str));
  505.    get_string(&pre_download,str,sizeof(str));
  506.    get_string(&pre_upload,str,sizeof(str));
  507. +  get_string(&convchars,str,sizeof(str));
  508.    if (!get_message("MSU",&message,&msg_len,&msg_size)) return close_reason;
  509.    if (!get_message("MCU",&cdup_msg,NULL,NULL)) return close_reason;
  510.    if (!get_message("MCD",&chdir_msg,NULL,NULL)) return close_reason;
  511. @@ -476,11 +478,11 @@
  512.    get_dupecheck();
  513.    get_dshortcut(&dshortcut);
  514.    if ((sockfr = fdopen(sock,"rt")) == NULL)
  515. -  { fprintf(stderr,"ftps(%i): socket fdopen failed\n");
  516. +  { fprintf(stderr,"ftps(%i): socket fdopen failed\n",getpid());
  517.      return CL_SOCKERR;
  518.    }
  519.    if ((sockf = fdopen(sock,"wt")) == NULL)
  520. -  { fprintf(stderr,"ftps(%i): socket fdopen failed\n");
  521. +  { fprintf(stderr,"ftps(%i): socket fdopen failed\n",getpid());
  522.      return CL_SOCKERR;
  523.    }
  524.    setvbuf(sockf,NULL,_IOLBF,0);
  525. diff -urbNB /tmp/differ/ftpd-2.25/src/glob_proc.h ./src/glob_proc.h
  526. --- /tmp/differ/ftpd-2.25/src/glob_proc.h    Thu Jan  1 01:00:00 1970
  527. +++ ./src/glob_proc.h    Thu Jun  3 13:29:08 1999
  528. @@ -0,0 +1,50 @@
  529. +/*   glob_proc.h
  530. + *
  531. + *   This file is part of FTP4ALL
  532. + *
  533. + *   Copyright (C) 1996,1997,1998,1999 by Christoph Schwarz
  534. + *
  535. + *   This program is free software; you can redistribute it and/or modify
  536. + *   it under the terms of the GNU General Public License as published by
  537. + *   the Free Software Foundation; either version 2 of the License, or
  538. + *   any later version.
  539. + *
  540. + *   This program is distributed in the hope that it will be useful,
  541. + *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  542. + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  543. + *   GNU General Public License for more details.
  544. + *
  545. + *   You should have received a copy of the GNU General Public License
  546. + *   along with this program; if not, write to the Free Software
  547. + *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  548. + */
  549. +
  550. +#ifndef _ftps_glob_proc_h
  551. +#define _ftps_glob_proc_h
  552. +
  553. +int send_reply(int rno, char* reply);
  554. +int add_dir(char* src, char* dir, char* dest, int maxlen);
  555. +void client_activity(char* str, ...);
  556. +void client_log_start(long lno, char* str, ...);
  557. +void client_log_finish(long lno, char* str, ...);
  558. +void client_log(long lno, char* str, ...);
  559. +void client_log_error(long lno);
  560. +int read_ftp_command(char* buffer, int bufferlen, char** param, int max, int* n);
  561. +int send_error(int rno, char* cmd, long lno);
  562. +int read_file_permission(char* dir,char* name,long* uid,long* gid,long* perm);
  563. +int send_message(int rno, int finish, char* buffer, char* str);
  564. +void quit(int reason);
  565. +int run_program(char* prog, char** param, int n, int rno, int finish, char* cd,
  566. +    int* exitcode, char* buffer);
  567. +int wildcard_matching(char* wildcard, char* filename, int csens);
  568. +void convert_filename(char* filename, int mode);
  569. +int read_permission_file(char* dir, long* uid, long* gid, long* perm,
  570. +    long* dlc, char** buffer, int* n);
  571. +int write_permission_file(char* dir, long uid, long gid, long perm);
  572. +int permission_part_ok(char* dir, int p, int uidok);
  573. +int remove_permission_file(char* dir);
  574. +long dirperm_to_fileperm(long perm);
  575. +int parse_command(char* p, char** param, int max, int* n);
  576. +int get_message(char* cmd, char** message, int* msg_len, int* msg_size);
  577. +
  578. +#endif
  579. diff -urbNB /tmp/differ/ftpd-2.25/src/glob_procd.h ./src/glob_procd.h
  580. --- /tmp/differ/ftpd-2.25/src/glob_procd.h    Thu Jan  1 01:00:00 1970
  581. +++ ./src/glob_procd.h    Thu Jun  3 13:29:08 1999
  582. @@ -0,0 +1,29 @@
  583. +/*   glob_procd.h
  584. + *
  585. + *   This file is part of FTP4ALL
  586. + *
  587. + *   Copyright (C) 1996,1997,1998,1999 by Christoph Schwarz
  588. + *
  589. + *   This program is free software; you can redistribute it and/or modify
  590. + *   it under the terms of the GNU General Public License as published by
  591. + *   the Free Software Foundation; either version 2 of the License, or
  592. + *   any later version.
  593. + *
  594. + *   This program is distributed in the hope that it will be useful,
  595. + *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  596. + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  597. + *   GNU General Public License for more details.
  598. + *
  599. + *   You should have received a copy of the GNU General Public License
  600. + *   along with this program; if not, write to the Free Software
  601. + *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  602. + */
  603. +
  604. +#ifndef _ftps_glob_procd_h
  605. +#define _ftps_glob_procd_h
  606. +
  607. +int load_config(const char* filename, int reconfig);
  608. +
  609. +#endif
  610. +
  611. +/* EOF */
  612. diff -urbNB /tmp/differ/ftpd-2.25/src/globals.h ./src/globals.h
  613. --- /tmp/differ/ftpd-2.25/src/globals.h    Sun Mar  7 21:19:47 1999
  614. +++ ./src/globals.h    Thu Jun  3 13:29:08 1999
  615. @@ -39,6 +39,7 @@
  616.  int                 chmodallowed        = 1;
  617.  int                 close_reason        = CL_ERROR;
  618.  char                close_server        = 0;
  619. +char*               convchars           = NULL;
  620.  char                cwd[256]            = "/";
  621.  struct check_s*     dcheck              = NULL;
  622.  int                 dcheck_count        = 0;
  623. @@ -93,7 +94,16 @@
  624.  FILE*               sockfr;
  625.  char                structure           = S_FILE;
  626.  int                 timeout             = 60;
  627. -struct top_s        top[10]             = { 0,0,0,0,0,0,0,0,0,0,0,0 };
  628. +struct top_s        top[10]             = { {"",0,"","",0,"","",0,"","",0,"" },
  629. +                                            {"",0,"","",0,"","",0,"","",0,"" },
  630. +                                            {"",0,"","",0,"","",0,"","",0,"" },
  631. +                                            {"",0,"","",0,"","",0,"","",0,"" },
  632. +                                            {"",0,"","",0,"","",0,"","",0,"" },
  633. +                                            {"",0,"","",0,"","",0,"","",0,"" },
  634. +                                            {"",0,"","",0,"","",0,"","",0,"" },
  635. +                                            {"",0,"","",0,"","",0,"","",0,"" },
  636. +                                            {"",0,"","",0,"","",0,"","",0,"" },
  637. +                                            {"",0,"","",0,"","",0,"","",0,"" } };
  638.  char                touch               = 0;
  639.  char                type                = T_ASCII;
  640.  long                umask_value;
  641. @@ -101,7 +111,7 @@
  642.  struct user_s*      user                = NULL;
  643.  int                 user_count          = 0;
  644.  int                 user_size           = 0;
  645. -struct user_f_s     usr                 = { 0,0,0,0,0,0,0,0,0,0 };
  646. +struct user_f_s     usr                 = { "",0,0,0,0,0,0,0,{0,0,0,0,0,0,0,0},0 };
  647.  
  648.  #endif
  649.  
  650. diff -urbNB /tmp/differ/ftpd-2.25/src/globalsd.h ./src/globalsd.h
  651. --- /tmp/differ/ftpd-2.25/src/globalsd.h    Sun Mar  7 21:16:46 1999
  652. +++ ./src/globalsd.h    Thu Jun  3 13:29:08 1999
  653. @@ -61,6 +61,7 @@
  654.  int             child_size       = 0;
  655.  int             children         = 0;
  656.  char            chmodallowed     = 1;
  657. +char*           convchars        = NULL;
  658.  struct check_s* dcheck           = NULL;
  659.  int             dcheck_count     = 0;
  660.  int             dcheck_size      = 0;
  661. @@ -84,6 +85,7 @@
  662.  char*           group_file       = NULL;
  663.  int             group_size       = 0;
  664.  int             groupop_limit    = 33;
  665. +int             groupop_cred     = 0;
  666.  long            groupop_rights   = 0;  
  667.  char            ident_mode       = 0;
  668.  struct msg_s    list_msg         = { NULL,0,NULL,0,0,default_list_msg };
  669. @@ -96,6 +98,7 @@
  670.  int             login_kick       = 0;
  671.  int             login_kick_signo = SIGKILL;
  672.  int             login_retries    = 10;
  673. +int             max_added        = 0;
  674.  int             max_anon         = 10;
  675.  int             max_anon_domain  = 10;
  676.  int             max_anon_ip      = 10;
  677. @@ -113,6 +116,7 @@
  678.  char*           program_name     = NULL;
  679.  char*           readme_file      = NULL;
  680.  char            resolver         = 1;
  681. +char            rftpdbouncer     = 0;
  682.  char*           script_path      = NULL;
  683.  char            server_closed    = 0;
  684.  char*           server_dir       = NULL;
  685. @@ -144,6 +148,7 @@
  686.  char*           user_file        = NULL;
  687.  int             user_size        = 0;
  688.  int             useredit_limit   = 33;
  689. +int             useredit_cred    = 0;
  690.  long            useredit_rights  = 0;
  691.  char            wait_port        = 0;
  692.  struct msg_s    welcome_msg      = { NULL,0,NULL,0,0,default_welcome_msg };
  693. diff -urbNB /tmp/differ/ftpd-2.25/src/list.c ./src/list.c
  694. --- /tmp/differ/ftpd-2.25/src/list.c    Sun Mar  7 21:16:46 1999
  695. +++ ./src/list.c    Thu Jun  3 13:29:08 1999
  696. @@ -29,6 +29,8 @@
  697.  #include <netinet/in.h>
  698.  #include <sys/socket.h>
  699.  #include <sys/stat.h>
  700. +#include <ctype.h>
  701. +#include <unistd.h>
  702.  #include "tweak.h"
  703.  #ifdef HAVE_SYS_SELECT_H
  704.    #include <sys/select.h>
  705. @@ -37,6 +39,7 @@
  706.    #include <sys/time.h>
  707.  #endif
  708.  #include "externs.h"
  709. +#include "glob_proc.h"
  710.  
  711.  #define LS_DOT       0x01
  712.  #define LS_LONG      0x02
  713. @@ -368,19 +371,19 @@
  714.        return -1;
  715.      }
  716.      if (FD_ISSET(sock,&fdset_r))
  717. -    { switch (read_ftp_command(sock,str,sizeof(str),&p,8,&n))
  718. +    { switch (read_ftp_command(str,sizeof(str),p,8,&n))
  719.        { case -1 :
  720.            free(buffer);
  721.            return -1;
  722.          case  0 :
  723.            if (strcasecmp(*p,"ABOR"))
  724. -          { if (send_reply(sock,503,"Unexpected command.") == -1)
  725. +          { if (send_reply(503,"Unexpected command.") == -1)
  726.              { free(buffer);
  727.                return -1;
  728.              }
  729.            } else
  730.            { free(buffer);
  731. -            send_reply(sock,426,"Transfer interrupted on request.");
  732. +            send_reply(426,"Transfer interrupted on request.");
  733.              return 1;
  734.            }
  735.        }
  736. diff -urbNB /tmp/differ/ftpd-2.25/src/login.c ./src/login.c
  737. --- /tmp/differ/ftpd-2.25/src/login.c    Sun Mar  7 21:16:46 1999
  738. +++ ./src/login.c    Thu Jun  3 13:29:08 1999
  739. @@ -23,8 +23,10 @@
  740.  #include <stdio.h>
  741.  #include <stdlib.h>
  742.  #include <string.h>
  743. +#include <unistd.h>
  744.  #include "tweak.h"
  745.  #include "externs.h"
  746. +#include "glob_proc.h"
  747.  
  748.  int cmd_user(char** p, int n)
  749.  { int   anon_login;
  750. diff -urbNB /tmp/differ/ftpd-2.25/src/perm.c ./src/perm.c
  751. --- /tmp/differ/ftpd-2.25/src/perm.c    Sun Mar  7 21:16:46 1999
  752. +++ ./src/perm.c    Thu Jun  3 13:29:08 1999
  753. @@ -26,9 +26,11 @@
  754.  #include <string.h>
  755.  #include <time.h>
  756.  #include <utime.h>
  757. +#include <unistd.h>
  758.  #include <sys/stat.h>
  759.  #include "tweak.h"
  760.  #include "externs.h"
  761. +#include "glob_proc.h"
  762.  
  763.  int superuser(void)
  764.  { return !(usr.class & 0x03);
  765. @@ -286,6 +288,8 @@
  766.    { fclose(file);
  767.      return -1;
  768.    }
  769. +  if (0 == st.st_size)
  770. +     return -1;
  771.    if (st.st_size < sizeof(struct perm_s))
  772.    { if (buffer && n)
  773.      { *n = 0;
  774. diff -urbNB /tmp/differ/ftpd-2.25/src/serverd.c ./src/serverd.c
  775. --- /tmp/differ/ftpd-2.25/src/serverd.c    Sun Mar  7 21:16:46 1999
  776. +++ ./src/serverd.c    Thu Jun  3 13:29:08 1999
  777. @@ -34,12 +34,21 @@
  778.  #include <sys/socket.h>
  779.  #include <sys/stat.h>
  780.  #include <arpa/inet.h>
  781. +#include <unistd.h>
  782. +#include <ctype.h>
  783.  #include <syslog.h>
  784.  #include "tweak.h"
  785.  #ifdef DES_ENCRYPTION
  786.    #include "des.h"
  787.  #endif
  788.  #include "externsd.h"
  789. +#include "glob_procd.h"
  790. +
  791. +int groupop(struct user_s* u);
  792. +int useredit(struct user_s* u);
  793. +char skipspace(char** x);
  794. +char skipnspace(char** x);
  795. +int get_iprange(char** ipr, char* ident);
  796.  
  797.  struct user_s* insert_user(struct user_s*);
  798.  
  799. @@ -121,6 +130,16 @@
  800.    if (sscanf(name,"%li",&i)) return i; else return -1;
  801.  }
  802.  
  803. +int group_user_count(struct user_s* us)
  804. +{ int            i;
  805. +  int            count = 0;
  806. +  struct user_s* tmp = user;
  807. +
  808. +  for (i=0;i<user_count;i++,tmp++) if (us->gid == tmp->gid) count++; 
  809. +  return count;
  810. +}
  811. +
  812. +
  813.  struct group_s* get_group_by_gid(long gid)
  814.  { struct group_s* g = group;
  815.    int             i;
  816. @@ -344,6 +363,11 @@
  817.      return;
  818.    }
  819.    
  820. +  if ((!superuser(c->user) && (max_added != 0)) && (groupop(c->user) && (group_user_count(c->user) >= max_added)))
  821. +  { server_reply(c,"-You are not allowed to add more users.");
  822. +    return;
  823. +  }
  824. +
  825.    /* Name */
  826.    if (strlen(*p) >= sizeof(usr.name))
  827.    { server_reply(c,"-User name too long");
  828. @@ -352,7 +376,8 @@
  829.    strcpy(usr.name,*p);
  830.  
  831.    /* Group */
  832. -  g = get_group_by_name(*(p+1));
  833. +  if ((superuser(c->user) || useredit(c->user)) && (!groupop(c->user)))
  834. +  { g = get_group_by_name(*(p+1));
  835.    if (g==NULL) 
  836.    { if (sscanf(*(p+1),"%i",&temp)) g = get_group_by_gid(temp);
  837.      if (g==NULL)
  838. @@ -361,6 +386,7 @@
  839.      }
  840.    }
  841.    usr.gid=g->gid;
  842. +  } else usr.gid = c->user->gid;
  843.    
  844.    /* Password */
  845.    *salt = salt_a[time(NULL) % 64];
  846. @@ -368,13 +394,13 @@
  847.    strcpy(usr.password,crypt(*(p+2),salt));
  848.  
  849.    /* Limit */
  850. -  if (!allowed(c->user,R_USER_CHANGE_RATIO))
  851. +  if (!superuser(c->user))
  852.    { if (groupop(c->user)) usr.limit = groupop_limit;
  853.      else if (useredit(c->user)) usr.limit = useredit_limit;
  854.      /* Should never happen */
  855.      else usr.limit = 33;
  856.    } else
  857. -  { if (!strcasecmp(*(p+3),"leech")) usr.limit = 0; 
  858. +  { if (strcasecmp(*(p+3),"leech")) usr.limit = 0; 
  859.      else if (sscanf(*(p+3),"1:%i",&temp)) usr.limit = 100 / temp;
  860.      else if (sscanf(*(p+3),"%i",&temp)) usr.limit = temp;
  861.      else
  862. @@ -513,7 +539,7 @@
  863.  }
  864.  
  865.  void print_ident(char* s, char* ident)
  866. -{ if (*ident!='\0') sprintf(s,"%s@",ident); else sprintf(s,"");
  867. +{ if (*ident!='\0') sprintf(s,"%s@",ident); else bzero(s,sizeof(s));
  868.    print_iprange(s+strlen(s),ident);
  869.  }
  870.  
  871. @@ -580,7 +606,7 @@
  872.        first = 0;
  873.      }
  874.      if (first) fprintf(file,":0.0.0.0");
  875. -    fprintf(file,":%li:%s:0x%02lX:%li",u->limit,u->info,u->class,u->credit);
  876. +    fprintf(file,":%i:%s:0x%02lX:%li",u->limit,u->info,u->class,u->credit);
  877.      first = 1;
  878.      for (j=0; j<8; j++) if (u->gids[j] != -1)
  879.      { fprintf(file,"%c%li",first ? ':' : ',' ,u->gids[j]);
  880. @@ -1080,7 +1106,7 @@
  881.    { server_reply(c,"-You are not superuser.");
  882.      return;
  883.    }
  884. -  if (n!=2 || !sscanf(*p,"%li",&gid) || strlen(*(p+1))>=sizeof(g->name))
  885. +  if (n!=2 || !sscanf(*p,"%i",&gid) || strlen(*(p+1))>=sizeof(g->name))
  886.    { server_reply(c,"-Syntax: GROUP CHANGE <gid> <name>");
  887.      return;
  888.    }
  889. @@ -1145,7 +1171,7 @@
  890.    { server_reply(c,"-You are not superuser.");
  891.      return;
  892.    }
  893. -  if (n!=1 || !sscanf(*p,"%li",&gid))
  894. +  if (n!=1 || !sscanf(*p,"%i",&gid))
  895.    { server_reply(c,"-Syntax: GRM <gid>");
  896.      return;
  897.    }
  898. @@ -1194,7 +1220,7 @@
  899.      if (strlen(str) == 18) strcat(str," (none)");
  900.      server_reply(c,str); return;
  901.    }
  902. -  if ((n == 2) && (**(p+1) == '+') || (**(p+1) == '-'))
  903. +  if ((n == 2) && ((**(p+1) == '+') || (**(p+1) == '-')))
  904.    { gid = get_gid(*(p+1)+1);
  905.      if (gid == -1)
  906.      { server_reply(c,"-Group does not exist.");
  907. @@ -1296,9 +1322,9 @@
  908.    { l = (strlen(cdpath+ofs) + 8) & ~0x07;
  909.      if (!strcmp(*p,cdpath+ofs))
  910.      { ofs += l;
  911. -      sscanf(*(p+1),"%li",cdpath+ofs);
  912. -      sscanf(*(p+2),"%li",cdpath+ofs+sizeof(long));
  913. -      sscanf(*(p+3),"%li",cdpath+ofs+(sizeof(long)*2));
  914. +      sscanf(*(p+1),"%li",(long*)(cdpath+ofs));
  915. +      sscanf(*(p+2),"%li",(long*)(cdpath+ofs+sizeof(long)));
  916. +      sscanf(*(p+3),"%li",(long*)(cdpath+ofs+(sizeof(long)*2)));
  917.        return;
  918.      }
  919.      ofs += l + (sizeof(long) * 3);
  920. @@ -1400,9 +1426,9 @@
  921.        top_d[i] ? top_d[i]->name : "*nobody*",
  922.        top_d[i] ? top_d[i]->kb_downloaded : 0,
  923.        top_e[i] ? top_e[i]->name : "*nobody*",
  924. -      top_e[i] ? (float)(top_e[i]->kb_uploaded*100)/top_e[i]->kb_downloaded : 0,
  925. +      (top_e[i] && top_e[i]->kb_downloaded) ? (float)(top_e[i]->kb_uploaded*100)/top_e[i]->kb_downloaded : 0,
  926.        top_l[i] ? top_l[i]->name : "*nobody*",
  927. -      top_l[i] ? (float)(top_l[i]->kb_uploaded*100)/top_l[i]->kb_downloaded : -1,
  928. +      (top_l[i] && top_l[i]->kb_downloaded) ? (float)(top_l[i]->kb_uploaded*100)/top_l[i]->kb_downloaded : -1,
  929.        top_u[i] ? top_u[i]->name : "*nobody*",
  930.        top_u[i] ? top_u[i]->kb_uploaded : 0);
  931.      server_reply(c,str);
  932. @@ -1513,6 +1539,7 @@
  933.    server_reply(c,script_path ? script_path : "\n");
  934.    server_reply(c,pre_download ? pre_download : "\n");
  935.    server_reply(c,pre_upload ? pre_upload : "\n");
  936. +  server_reply(c,convchars ? convchars : "\n");
  937.  }
  938.  
  939.  void send_upload_msg(struct child_s* c, char** p, int n)
  940. @@ -1722,6 +1749,7 @@
  941.    if (children > n) memmove(c,c+1,(children-n)*sizeof(struct child_s));
  942.    if (!children) num_anon = num_users = 0;
  943.    if (user_file) write_user_file(user_file,NULL);
  944. +  if (group_file) write_group_file(group_file);
  945.  }
  946.  
  947.  
  948. @@ -1761,6 +1789,10 @@
  949.    { server_reply(c,"-You are not superuser.");
  950.      return;
  951.    }
  952. +  if ((!superuser(c->user) && (max_added != 0)) && (groupop(c->user) && (group_user_count(c->user) >= max_added)))
  953. +  { server_reply(c,"-You are not allowed to add more users.");
  954. +    return;
  955. +  }
  956.    if (su && !superuser(c->user))
  957.    { server_reply(c,"-You can not add superusers.");
  958.      return;  
  959. @@ -2170,7 +2202,7 @@
  960.          { server_reply(c,"-You are not allowed to change that information.");
  961.            return;
  962.          }
  963. -        if (sscanf(ep,"%li",&i))
  964. +        if (sscanf(ep,"%i",&i))
  965.          { if ( i >= 0 && i <= 9 ) 
  966.            { strcpy(ep,"0.0.0.0");
  967.              if (get_iprange(&ep,u->idents[i]) != 0) se=1;
  968. @@ -2181,7 +2213,9 @@
  969.          { server_reply(c,"-You are not allowed to change that information.");
  970.            return;
  971.          }
  972. -        if (sscanf(ep,"%li",&i)) u->limit = i; else se = 1;
  973. +        if (groupop(c->user)) u->limit = groupop_limit;
  974. +           else if (useredit(c->user)) u->limit = useredit_limit;
  975. +           else if (sscanf(ep,"%i",&i)) u->limit = i; else se = 1;
  976.        } else if (!strcasecmp(*p,"INFO"))
  977.        { if (!allowed(c->user,R_USER_CHANGE_OTHER))
  978.          { server_reply(c,"-You are not allowed to change that information.");
  979. @@ -2193,13 +2227,23 @@
  980.          { server_reply(c,"-You are not allowed to change that information.");
  981.            return;
  982.          }
  983. -        if (sscanf(ep,"%li",&l)) u->credit = l; else se = 1;
  984. +        if (groupop(c->user))
  985. +        { if (sscanf(ep,"%li",&l)) 
  986. +          { if (l < (groupop_cred * 1024)) u->credit = l; }
  987. +          else se = 1;
  988. +        }
  989. +        else if (useredit(c->user))
  990. +             { if (sscanf(ep,"%li",&l))
  991. +               { if (l < ( useredit_cred * 1024)) u->credit = l; }
  992. +               else se = 1;
  993. +             }
  994. +        else if (sscanf(ep,"%li",&l)) u->credit = l; else se = 1;
  995.        } else if (!strcasecmp(*p,"CREDIT+"))
  996.        { if (!allowed(c->user,R_USER_CHANGE_STATS))
  997.          { server_reply(c,"-You are not allowed to change that information.");
  998.            return;
  999.          }
  1000. -        if (sscanf(ep,"%li",&l)) u->credit += l; else se = 1;
  1001. +        if (!groupop(c->user)) if (sscanf(ep,"%li",&l)) u->credit += l; else se = 1;
  1002.        } else if (!strcasecmp(*p,"CREDIT-"))
  1003.        { if (!allowed(c->user,R_USER_CHANGE_STATS))
  1004.          { server_reply(c,"-You are not allowed to change that information.");
  1005. @@ -2211,13 +2255,13 @@
  1006.          { server_reply(c,"-You are not allowed to change that information.");
  1007.            return;
  1008.          }
  1009. -        if (sscanf(ep,"%li",&l)) u->credit = l * 1024; else se = 1;
  1010. +        if (!groupop(c->user)) if (sscanf(ep,"%li",&l)) u->credit = l * 1024; else se = 1;
  1011.        } else if (!strcasecmp(*p,"MBCRED+"))
  1012.        { if (!allowed(c->user,R_USER_CHANGE_STATS))
  1013.          { server_reply(c,"-You are not allowed to change that information.");
  1014.            return;
  1015.          }
  1016. -        if (sscanf(ep,"%li",&l)) u->credit += l * 1024; else se = 1;
  1017. +        if (!groupop(c->user)) if (sscanf(ep,"%li",&l)) u->credit += l * 1024; else se = 1;
  1018.        } else if (!strcasecmp(*p,"MBCRED-"))
  1019.        { if (!allowed(c->user,R_USER_CHANGE_STATS))
  1020.          { server_reply(c,"-You are not allowed to change that information.");
  1021. @@ -2395,7 +2439,7 @@
  1022.    { server_reply(c,"-Syntax: USER LIST [<options>] [<user>|<group>]");
  1023.      return;
  1024.    }
  1025. -  if (!allowed(c->user,R_USER_LIST) && (g || us))
  1026. +  if (!allowed(c->user,R_USER_LIST) && (c->user != us) && (!g || !us))
  1027.    { server_reply(c,"-You cannot list users except yourself.");
  1028.      return;
  1029.    }
  1030. @@ -2420,12 +2464,12 @@
  1031.          else if (templateuser(u)) ch = 't'; else if (groupop(u)) ch = 'g';
  1032.          else if (useredit(u)) ch = 'e'; else ch = 'n';
  1033.        grpe = get_group_by_gid(u->gid);
  1034. -      sprintf(str,"+%-9s %-9s %c%c %c%c%c %1i %3li %3li %7li %7li ",
  1035. -        u->name, grpe?grpe:NULL , u->password[0] ? ' ' : '*',ch,
  1036. +      sprintf(str,"+%-9s %-9s %c%c %c%c%c %1li %3li %3li %7li %7li ",
  1037. +        u->name, grpe->name?grpe->name:NULL , u->password[0] ? ' ' : '*',ch,
  1038.          invisible(u) ? 'i' : '-', coloruser(u) ? 'c' : '-', no_pass_change(u) ? 'p' : '-',
  1039.          (u->class & 0x70)>>4,u->uid,u->gid,
  1040.          u->kb_downloaded / 1024, u->kb_uploaded / 1024);
  1041. -      sprintf(str+strlen(str),"%3li %7li ",u->limit,u->credit / 1024);
  1042. +      sprintf(str+strlen(str),"%3i %7li ",u->limit,u->credit / 1024);
  1043.        if (u->last_login!=0) {
  1044.          strftime(str+strlen(str),sizeof(str)-strlen(str),"%d/%m %H:%M",
  1045.            localtime(&u->last_login));
  1046. @@ -2569,7 +2613,7 @@
  1047.  {
  1048.    if (in_iprange(ip, iprange))
  1049.    { if (*iprange=='\0' || *iprange=='*') return 1; else 
  1050. -    { if (strcmp(ident, iprange)==0) return 1; else return 0;
  1051. +    { if ((0 == ident_mode) || (strcmp(ident, iprange)==0)) return 1; else return 0;
  1052.      }
  1053.    } return 0;
  1054.  }
  1055. @@ -3106,7 +3150,7 @@
  1056.        return;
  1057.    }
  1058.  #ifdef DEBUG
  1059. -  fprintf(debugf,"child command",*p);
  1060. +  fprintf(debugf,"child command");
  1061.    for (i = 0; i < n; i++) fprintf(debugf," %s",*(p+i));
  1062.    fprintf(debugf,"\n");
  1063.    i = 0;
  1064. diff -urbNB /tmp/differ/ftpd-2.25/src/site.c ./src/site.c
  1065. --- /tmp/differ/ftpd-2.25/src/site.c    Sun Mar  7 21:16:46 1999
  1066. +++ ./src/site.c    Thu Jun  3 13:29:08 1999
  1067. @@ -30,13 +30,19 @@
  1068.  #include <sys/signal.h>
  1069.  #include <sys/stat.h>
  1070.  #include <sys/wait.h>
  1071. +#include <sys/socket.h>
  1072.  #include "tweak.h"
  1073.  #include "externs.h"
  1074. +#include "glob_proc.h"
  1075.  
  1076.  struct file_s* find_name(struct file_s*,char*,int,int*);
  1077.  struct dirent* findfirst(DIR**,char*,char*);
  1078.  struct dirent* findnext(DIR*,char*);
  1079.  
  1080. +char skipnspace(char** x);
  1081. +char skipspace(char** x);
  1082. +void endfind(DIR* d);
  1083. +
  1084.  int cmd_site_adduser_syntax(int rno)
  1085.  { return send_reply(rno,
  1086.    "Syntax: ADDUSER <name> <group|gid> <password> <1:ratio|limit|leech> <ip0> [<ip1> [<ip2> [...]]]\n"
  1087. @@ -262,7 +268,7 @@
  1088.    return send_reply(250,"CHMOD command finished.");
  1089.  }
  1090.  
  1091. -int site_chmod_rec(char* path, int file, int who, char cmd, long mode)
  1092. +void site_chmod_rec(char* path, int file, int who, char cmd, long mode)
  1093.  { DIR*           d;
  1094.    struct dirent* de;
  1095.    long           dperm;
  1096. @@ -583,7 +589,7 @@
  1097.    struct stat    st;
  1098.  
  1099.    dir = opendir(path);
  1100. -  if (!dir) return;
  1101. +  if (!dir) return 0;
  1102.    strcat(path,"/");
  1103.    name = path + strlen(path);
  1104.    while ((d = readdir(dir)) != NULL)
  1105. diff -urbNB /tmp/differ/ftpd-2.25/src/transfer.c ./src/transfer.c
  1106. --- /tmp/differ/ftpd-2.25/src/transfer.c    Mon Apr  5 17:01:15 1999
  1107. +++ ./src/transfer.c    Thu Jun  3 13:29:08 1999
  1108. @@ -31,6 +31,7 @@
  1109.  #include <unistd.h>
  1110.  #include <netinet/in.h>
  1111.  #include <sys/socket.h>
  1112. +#include <arpa/inet.h>
  1113.  #include <sys/stat.h>
  1114.  #include <sys/wait.h>
  1115.  #include <setjmp.h>
  1116. @@ -43,9 +44,13 @@
  1117.  #endif
  1118.  #include "externs.h"
  1119.  #include "perm.h"
  1120. +#include "glob_proc.h"
  1121.  
  1122.  jmp_buf scriptabortjmp;
  1123.  
  1124. +int run_prog_xt(char* prog, char **param, int* exitcode, char* returner);
  1125. +int find_dupe(char* filename, char* dir);
  1126. +
  1127.  void alarmhandler(int sig)
  1128.  { scriptabort = 1;
  1129.    longjmp(scriptabortjmp,1);
  1130. @@ -100,6 +105,7 @@
  1131.    { strftime(dir,sizeof(dir),"%Y%m%d%H%M%S",localtime(&st.st_mtime));
  1132.      return send_reply(213,dir);
  1133.    } else send_message(550,1,"%s: not a plain file.",*p);
  1134. +  return 0;
  1135.  }
  1136.  
  1137.  int cmd_size(char** p, int n)
  1138. @@ -113,6 +119,7 @@
  1139.    { sprintf(dir,"%li",st.st_size);
  1140.      return send_reply(213,dir);
  1141.    } else send_message(550,1,"%s: not a plain file.",*p);
  1142. +  return 0;
  1143.  }
  1144.  
  1145.  int cmd_rest(char** p, int n)
  1146. @@ -132,7 +139,7 @@
  1147.    return ((size / 1024) <= usr.credit);
  1148.  }
  1149.  
  1150. -cmd_transferpermitted(char* prog,char* buffer)
  1151. +int cmd_transferpermitted(char* prog,char* buffer)
  1152.  { char  str[255];
  1153.    int   ec;
  1154.    char* p[8];
  1155. @@ -140,14 +147,14 @@
  1156.    p[0] = prog;
  1157.    p[1] = buffer;
  1158.  
  1159. -  if (run_prog_xt(prog,p,&ec,&str) == -1) return 0;
  1160. +  if (run_prog_xt(prog,p,&ec,str) == -1) return 0;
  1161.  
  1162.    if (WIFEXITED(ec))
  1163.    { if (WEXITSTATUS(ec) && (WEXITSTATUS(ec) != -1)) ec = 550; else ec = 150;
  1164.    } else ec = 150;
  1165.    if (ec == 550)
  1166.    { sprintf(buffer,"Transfer initial check failed (%s).",str);
  1167. -    if (*buffer) if (send_message(ec,ec == 550,buffer) == -1) return -1;
  1168. +    if (*buffer) if (send_message(ec,ec == 550,buffer,NULL) == -1) return -1;
  1169.    }
  1170.    return ec == 550 ? 1 : 0;
  1171.  }
  1172. @@ -349,8 +356,8 @@
  1173.    char*           p[8];
  1174.    void            (*oldvec)();
  1175.  
  1176. -  for (i=0; i<check_count; i++, ch++) if (!strcasecmp(name+strlen(name)-
  1177. -    strlen(ch->extension),ch->extension))
  1178. +  for (i=0; i<check_count; i++, ch++) if (wildcard_matching(ch->extension, name+strlen(name)-
  1179. +    strlen(ch->extension), 0))
  1180.    { if (add_dir(cwd,dir,buffer,512) == -1) return 0;
  1181.      i = 0;
  1182.      p[i++] = ch->name;
  1183. @@ -372,7 +379,7 @@
  1184.      { if (WEXITSTATUS(i) && (WEXITSTATUS(i) != -1)) i = 550; else i = 226;
  1185.      } else i = 226;
  1186.      if ((i == 550) && !*buffer) strcpy(buffer,"File is corrupt.");
  1187. -    if (*buffer) if (send_message(i,i == 550,buffer) == -1) return -1;
  1188. +    if (*buffer) if (send_message(i,i == 550,buffer,NULL) == -1) return -1;
  1189.      if (i == 550)
  1190.      { add_dir(cwd,dir,buffer,512);
  1191.        add_dir(buffer,name,buffer,512);
  1192. @@ -388,8 +395,8 @@
  1193.    int             i;
  1194.    char*           p[8];
  1195.  
  1196. -  for (i=0; i<dcheck_count; i++, ch++) if (!strcasecmp(name+strlen(name)-
  1197. -    strlen(ch->extension),ch->extension))
  1198. +  for (i=0; i<dcheck_count; i++, ch++) if (wildcard_matching(ch->extension, name+strlen(name)-
  1199. +    strlen(ch->extension), 0))
  1200.    { i = 0;
  1201.      p[i++] = ch->name;
  1202.      if (*ch->param) p[i++] = ch->param;
  1203. @@ -400,7 +407,7 @@
  1204.      { if (WEXITSTATUS(i) && (WEXITSTATUS(i) != -1)) i = 550; else i = 150;
  1205.      } else i = 150;
  1206.      if ((i == 550) && !*buffer) strcpy(buffer,"Dupe check failed.");
  1207. -    if (*buffer) if (send_message(i,i == 550,buffer) == -1) return -1;
  1208. +    if (*buffer) if (send_message(i,i == 550,buffer,NULL) == -1) return -1;
  1209.      return i == 550 ? 1 : 0;
  1210.    }
  1211.    return 0;
  1212. @@ -408,7 +415,7 @@
  1213.  
  1214.  void cmd_stor_rm(char* fullname, char* dir, char* name)
  1215.  { if (add_dir(cwd,dir,fullname,512) == -1) return;
  1216. -  if (add_dir(fullname,name,fullname,512,0) == -1) return;
  1217. +  if (add_dir(fullname,name,fullname,512) == -1) return;
  1218.    unlink(fullname+1);
  1219.  }
  1220.  
  1221. @@ -455,7 +462,7 @@
  1222.    client_activity("UPLOAD %s",name);
  1223.    *(name-1) = '/';
  1224.    ok = add_dir(cwd,*p,buffer,sizeof(buffer));
  1225. -  printf("FCO- %li %li %s\n",usr.uid,-2,buffer);
  1226. +  printf("FCO- %li %i %s\n",usr.uid,-2,buffer);
  1227.    fgets(buffer+2048, sizeof(buffer)-2048, stdin);
  1228.    client_log_start(LG_PUT,"UPLOAD %s",ok == -1 ? *p : buffer);
  1229.    split_dir(*p,&dir,&name,0);
  1230.